作者:命运2502901041_350 | 来源:互联网 | 2022-10-26 13:35
这里这个问题表明,std::atomic
被普遍认为有大小相同T
,而事实上,这似乎是对GCC,铛,和MSVC在x86,x64和ARM的情况。
在std::atomic
某个类型始终无锁的实现中T
,是否保证其内存布局与的内存布局相同T
?是否还有其他特殊要求std::atomic
,例如对齐?
1> ζ--..:
在查看[atomics.types.generic]时,您链接的答案部分引用了该报价,关于对齐的唯一说明是您之前看到的注释:
注意:原子专业化的表示形式不必与其相应的参数类型相同。专门化的大小应尽可能相同,因为这可以减少移植现有代码所需的工作量
在较新的版本中:
原子专业化的表示形式与其对应的参数类型不必具有相同的大小和对齐要求。
此外,至少有一个架构IA64 对诸如的指令的原子行为提出了要求cmpxchg.acq
,这表明以IA64为目标的编译器很可能需要以与非原子类型不同的方式对齐原子类型,即使没有锁也是如此。 。
此外,使用诸如压缩结构之类的编译器功能将导致原子和非原子变体之间的对齐方式不同。考虑以下示例:
#include
#include
struct __attribute__ ((packed)) atom{
char a;
std::atomic_long b;
};
struct __attribute__ ((packed)) nonatom{
char a;
long b;
};
atom atom1;
nonatom nonatom1;
int disp_aligns(int num) {
std::cout<
上的至少一个配置中,对准atom1.b
将是一个8字节的边界上,而对准nonatom1.b
将是1个字节的边界上。但是,这是在我们要求打包结构的前提下进行的。目前尚不清楚您是否对此案感兴趣。